#!/usr/bin/python
# -*- coding: utf8 -*-

from sets import Set
import sys

if len(sys.argv) == 1:
    print "Parseando la cadena vacia..." 
    cadena = '$'
elif len(sys.argv) == 2:
    print "Parseando la cadena " + sys.argv[1] + "..."
    cadena = sys.argv[1]+'$'
else:
    print "----------------------"
    print "Error"
    print "----------------------"
    print "Ingrese de a una cadena"
    sys.exit(1)
 
if cadena.count("$") > 1:
	print "----------------------"
	print "Error de sintaxis"
	print "----------------------"
	print "Caracter inválido $"
	sys.exit(1)
posicion = 0

class ParseError(Exception):
    def __init__(self, esperado):
        self.esperado = esperado
    def __str__(self):
        return "----------------------\n" + \
               "Error de sintaxis\n" + \
               "----------------------\n" + \
               "Se esperaba recibir alguno de: %s\n" % list(self.esperado) + \
               "Se recibió: '%s'\n" % tc() + \
               "Ubicación: %s\n" % cadena + \
               (" " * (11 + posicion)) + '^'


def tc():
    global posicion
    global cadena
    return cadena[posicion]

def match(c):
    global posicion
    global cadena
    if cadena[posicion] == c:
        posicion += 1
    else:
        raise ParseError(c)


def noterm_S():
    match('a')
    while tc() in Set(['a']):
        match('a')
    if tc() in Set(['b']):
        match('b')
    while tc() in Set(['c']):
        match('c')

try:
    noterm_S()
    match('$')
    print 'OK!'
except ParseError, e:
    print e

